home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
UUPC11QS.ARJ
/
EXPATH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-16
|
7KB
|
160 lines
/*--------------------------------------------------------------------*/
/* e x p a t h . c */
/* */
/* Path expansion functions for UUPC/extended */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* MS-DOS and OS/2 header files */
/*--------------------------------------------------------------------*/
#include <ctype.h>
#include <stdio.h>
#include <direct.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
/*--------------------------------------------------------------------*/
/* UUPC/extended header files */
/*--------------------------------------------------------------------*/
#include "lib.h"
#include "expath.h"
#include "hlib.h"
#include "hostable.h"
#include "security.h"
#include "usertabl.h"
/*--------------------------------------------------------------------*/
/* e x p a n d _ p a t h */
/* */
/* Expands ~, ~/ and relative paths */
/*--------------------------------------------------------------------*/
char *expand_path(char *path, /* Input/output path name */
const char *cur_dir, /* Default directory path */
const char *home, /* Default home directory */
const char *ftype ) /* Default extension */
{
char *p, *fname;
char save[FILENAME_MAX];
struct UserTable *userp;
/*--------------------------------------------------------------------*/
/* Convert backslashes to slashes */
/*--------------------------------------------------------------------*/
p = path;
while ((p = strchr(p,'\\')) != NULL)
*p++ = '/';
/*--------------------------------------------------------------------*/
/* Add optional extension, if needed */
/*--------------------------------------------------------------------*/
if ( ftype != NULL )
{
p = strrchr(path,'/'); /* Get the last slash in name */
if ( p == NULL ) /* No slash? */
p = path; /* Okay, look at entire name */
if ( strchr( p , '.') == NULL ) /* Does name have a period? */
strcat( strcat(p, ".") ,ftype );
/* No --> Add extension */
} /* if ( ftype != NULL ) */
/*--------------------------------------------------------------------*/
/* If a fully qualified path name, return */
/*--------------------------------------------------------------------*/
if (*path == '/')
return path; /* nothing to do */
/*--------------------------------------------------------------------*/
/* If non-default drive and not full path, reject the path */
/*--------------------------------------------------------------------*/
if (isalpha( *path ) && (path[1] == ':'))
{
if (path[2] == '/') /* Absolute path on drive? */
return path; /* Yes --> Leave it alone */
printmsg(0, "expand_path: Invalid path \"%s\"; \
relative path on non-default drive. (Use full path for file.)",path);
return NULL; /* nothing to do */
} /* if */
else
p = path; /* Copy entire path */
/*--------------------------------------------------------------------*/
/* Try to translate the file as a home directory path */
/*--------------------------------------------------------------------*/
strcpy(save, p);
if (save[0] == '~') {
if (save[1] == '/') {
strcpy(path, home); /* Use home dir for this user */
fname = save + 2; /* Step past directory for simple name */
}
else {
if ((fname = strchr(save + 1, '/')) == NULL)
{
printmsg(0,"expand_path: path \"%s\" illegal",p);
return NULL;
}
/*--------------------------------------------------------------------*/
/* Look in /etc/passwd for the user id */
/*--------------------------------------------------------------------*/
*fname++ = '\0'; /* End string, step past it */
userp = checkuser(save + 1); /* Locate user id in table */
if ( userp == BADUSER ) /* Invalid user id? */
{ /* Yes --> Dump in trash */
printmsg(0,"expand_path: User \"%s\" is invalid", save + 1);
return NULL;
} /* if */
strcpy(path, userp->homedir);
} /* else */
} /* if (save[0] == '~') */
/*--------------------------------------------------------------------*/
/* No user id appears in the path; just append the input data */
/* to the current directory to convert the relative path to an */
/* absolute path */
/*--------------------------------------------------------------------*/
else {
fname = save; /* Give it the file name - 6/23/91 */
if ( cur_dir == NULL )
getcwd( path, FILENAME_MAX);
else if ( equal(cur_dir,"."))
{
strcpy( path, save );
return path;
}
else
strcpy( path, cur_dir );
} /* else */
/*--------------------------------------------------------------------*/
/* Normalize the path, and then add the name */
/*--------------------------------------------------------------------*/
while ((p = strchr(p,'\\')) != NULL)
*p++ = '/';
if ( path[ strlen( path ) - 1 ] != '/' )
strcat( path, "/");
strlwr( path ); /* Can lower case path, but not the
name because name may be UNIX! */
strcat( path, fname );
/*--------------------------------------------------------------------*/
/* Return data to caller */
/*--------------------------------------------------------------------*/
return path;
} /* expand_path */